package com.dadonas.fluxocaixa.entrada;

import java.text.ParseException;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.text.TextUtils;

import com.dadonas.fluxocaixa.TotalResult;
import com.dadonas.fluxocaixa.db.DbConst;
import com.dadonas.fluxocaixa.db.DbConstEntrada;
import com.dadonas.fluxocaixa.db.GenericDAO;
import com.dadonas.utils.Parser;
import com.dadonas.utils.ValidationException;

public class EntradaDAO extends GenericDAO{
	
	public EntradaDAO(Context context) {
		super(context);
	}

	public long persist(Entrada entrada) throws ValidationException{
		ValidationException ex = new ValidationException();
		
		if (TextUtils.isEmpty(entrada.getNome())){
			ex.addMessage("Informe o nome.");
		}
		
		if (entrada.getPrevisto() == null || entrada.getPrevisto() == 0){
			ex.addMessage("Informe o valor.");
		}
		
		if (ex.hasMessages()){
			throw ex;
		}
		
		long id = 0;
		if (entrada.getId() == null || entrada.getId() == -1){
			ContentValues values = createContentValues(entrada);
			id = db.insert(DbConstEntrada.TABLE_NAME, null, values);
		} else{
			ContentValues values = createContentValues(entrada);
			db.update(DbConstEntrada.TABLE_NAME, values, DbConstEntrada.COL_ID + " = ?" , new String[]{String.valueOf(entrada.getId())});
		}
		
		return id;
	}
	
	public Entrada find(long id){
		Cursor cursor = db.query(DbConstEntrada.TABLE_NAME, DbConstEntrada.COLS, DbConstEntrada.COL_ID + " = ?", new String[]{String.valueOf(id)}, null, null, null);
		cursor.moveToFirst();
		if (cursor != null){
			try {
				Entrada ent = new Entrada();
				ent.setId(id);
				ent.setNome(cursor.getString(1));
				ent.setPrevisto(Parser.toDouble(cursor.getString(2)));
				if (!cursor.isNull(3)){
					ent.setRealizado(Parser.toDouble(cursor.getString(3)));
				}
				ent.setData(Parser.toData(cursor.getString(4),DbConst.DATE_FORMAT));
				if (!cursor.isNull(5)){
					ent.setDescricao(cursor.getString(5));				
				}
				cursor.close();
				return ent;
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}
		
		return null;
	}
	
	public void update(Entrada entrada){
		db.update(DbConstEntrada.TABLE_NAME, createContentValues(entrada), DbConstEntrada.COL_ID + " = ?", new String[]{String.valueOf(entrada.getId())});
	}
	
	public void delete(long id){
		db.delete(DbConstEntrada.TABLE_NAME, DbConstEntrada.COL_ID + " = ?", new String[]{String.valueOf(id)});
	}
	
	public void updateRealizado(Long id, Double realizado){
		ContentValues values = new ContentValues();
		values.put(DbConstEntrada.COL_REALIZADO, realizado);		
		db.update(DbConstEntrada.TABLE_NAME, values, DbConstEntrada.COL_ID + " = ?", new String[]{String.valueOf(id)});
	}
	
	public void updatePrevisto(Long id, Double realizado){
		ContentValues values = new ContentValues();
		values.put(DbConstEntrada.COL_PREVISTO, realizado);		
		db.update(DbConstEntrada.TABLE_NAME, values, DbConstEntrada.COL_ID + " = ?", new String[]{String.valueOf(id)});
	}
	
	public Cursor loadAll(){
		return db.query(DbConstEntrada.TABLE_NAME, DbConstEntrada.COLS, null, null, null, null, null);
	}
	
	private ContentValues createContentValues(Entrada entrada){
		ContentValues values = new ContentValues();
		values.put(DbConstEntrada.COL_NOME, entrada.getNome());
		values.put(DbConstEntrada.COL_PREVISTO, entrada.getPrevisto());
		values.put(DbConstEntrada.COL_REALIZADO, entrada.getRealizado());
		values.put(DbConstEntrada.COL_DATA, Parser.formatData(entrada.getData(), DbConst.DATE_FORMAT));
		values.put(DbConstEntrada.COL_DESCRICAO, entrada.getDescricao());
		
		return values;
	}
	
	public TotalResult createTotal(Cursor cursor){
		TotalResult total = new TotalResult();
		
		if (cursor != null && cursor.getCount() > 0){
			cursor.moveToFirst();
			double previsto = 0;
			double previstoReal = 0;
			double realizado = 0;
			do{
				previsto += cursor.getDouble(2);
				
				if (!cursor.isNull(3)){
					realizado += cursor.getDouble(3);
					previstoReal += cursor.getDouble(3);
				} else{
					previstoReal += cursor.getDouble(2);
				}
			} while (cursor.moveToNext());
			
			total.setPrevisto(previsto);
			total.setPrevistoReal(previstoReal);
			total.setRealizado(realizado);
		}
		
		return total;
	}

}
